package cn.com.code.hwjs;

import java.util.Scanner;

/**
 * @author zhengpei
 * @date 2022/4/19
 */
public class HJ16 {

  /**
   * 题目描述
   * 王强今天很开心，公司发给N元的年终奖。王强决定把年终奖用于购物，他把想买的物品分为两类：主件与附件，附件是从属于某个主件的，下表就是一些主件与附件的例子：
   * 主件 附件
   * 电脑 打印机，扫描仪
   * 书柜 图书
   * 书桌 台灯，文具
   * 工作椅 无
   * 如果要买归类为附件的物品，必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多，为了不超出预算，他把每件物品规定了一个重要度，分为 5 等：用整数 1 ~ 5 表示，第 5 等最重要。他还从因特网上查到了每件物品的价格（都是 10 元的整数倍）。他希望在不超过 N 元（可以等于 N 元）的前提下，使每件物品的价格与重要度的乘积的总和最大。
   * 设第 j 件物品的价格为 v[j] ，重要度为 w[j] ，共选中了 k 件物品，编号依次为 j 1 ， j 2 ，……， j k ，则所求的总和为：
   * v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。（其中 * 为乘号）
   * 请你帮助王强设计一个满足要求的购物单。
   * ————————————————
   * https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&difficulty=3&judgeStatus=undefined&tags=&title=
   */
  /**
   * 思路
   * 思路分析：如果熟悉背包问题，很容易通过题目描述考虑到背包问题的解决方法上去。
   * <p>
   * 1，抛开此题的主件和附件限制，就是一个01背包。
   * <p>
   * 2，如果加上主件附件限制，发现和多重背包有些类型。
   * 所以此题就是01背包和多重背包的混合。主件就是01背包的方法，附件就是多重背包的方法因为附件有限制条件。
   * 但是，此题中附件的数量给出了明确的限制就是0/1/2个。所以，在处理附件的时候就不需要按照多重背包去处理。
   * <p>
   * 所以，这里可以将题目转换为01背包来解决，将附件转化到主件上去，分为下面四种：
   * 主件
   * 主件+附件1
   * 主件+附件2
   * 主件+附件1+附件2
   */


  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNext()) {
      int N = scanner.nextInt();
      int m = scanner.nextInt();
      int[] price = new int[m];
      int[] value = new int[m];
      int[] ZhuFu = new int[m];
      for (int i = 0; i < m; i++) {
        price[i] = scanner.nextInt();
        value[i] = scanner.nextInt() * price[i];   //定义 价值=重要度*价格
        ZhuFu[i] = scanner.nextInt();
      }
      //采用动态规划
      int[][] dp = new int[m + 1][N + 1];  //dp[i][j]表示用j钱购买i件物品的总价值
      for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= N; j++) {
          if (ZhuFu[i - 1] == 0) {  //表示为主件
            if (j >= price[i - 1]) {
              dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - price[i - 1]] + value[i - 1]);    //分别表示不买第i件和买第i件物品之后的最大价值
            } else {
              dp[i][j] = dp[i - 1][j];
            }
          } else {    //表示为附件，附件需要购买主件
            if (price[i - 1] + price[ZhuFu[i - 1] - 1] <= j) {
              dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - price[i - 1] - price[ZhuFu[i - 1] - 1]] + value[i - 1]);
            } else {
              dp[i][j] = dp[i - 1][j];
            }
          }
        }
      }
      System.out.println(dp[m][N]);
    }
  }
}